﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace AlgorytmyGenetyczne.Operatory
{
    public class SelekcjaTurniejowa : IOperator
    {
        private readonly Random losowanie;
        public Populacja WynikSelekcji { get; private set; }
        public int rozmiarTurnieju;

        public SelekcjaTurniejowa()
        {
            losowanie = new Random();
            WynikSelekcji = new Populacja();
            rozmiarTurnieju = 10;
        }

        public Populacja wykonaj(Populacja populacja)
        {
            var turniej = new Osobnik[rozmiarTurnieju];
            WynikSelekcji.Osobnicy.Clear();
            List<Osobnik> osobnicy = populacja.Osobnicy;
            for (int i = 0; i < osobnicy.Count; i++)
            {
                for (int j = 0; j < rozmiarTurnieju; j++)
                {
                    Osobnik wylosowany = wylosujOsobnika(populacja);
                    turniej[j] = wylosowany;
                }
                WynikSelekcji.Osobnicy.Add(znajdzWygranego(turniej));
            }


            return new Populacja(WynikSelekcji);
        }

        private Osobnik wylosujOsobnika(Populacja populacja)
        {
            return populacja.Osobnicy[losowanie.Next(populacja.Osobnicy.Count - 1)];
        }

        private static Osobnik znajdzWygranego(Osobnik[] turniej)
        {
            double maxOcena = Double.MinValue;
            Osobnik osobnikWygrywajacy = null;
            for (int i = 0; i < turniej.Length; i++)
            {
                Osobnik os = turniej[i];
                if (os.Ocena > maxOcena)
                {
                    maxOcena = os.Ocena;
                    osobnikWygrywajacy = os;
                }
            }
            return osobnikWygrywajacy;
        }
    }
}
